Skip to content

[fix] battleRoom 이탈 관련 grace period 개선#208

Merged
MADUPAL merged 1 commit into
devfrom
fix/196-battleroom-이탈-관련-수정
Apr 13, 2026

Hidden character warning

The head ref may contain hidden characters: "fix/196-battleroom-\uc774\ud0c8-\uad00\ub828-\uc218\uc815"
Merged

[fix] battleRoom 이탈 관련 grace period 개선#208
MADUPAL merged 1 commit into
devfrom
fix/196-battleroom-이탈-관련-수정

Conversation

@MADUPAL

@MADUPAL MADUPAL commented Apr 11, 2026

Copy link
Copy Markdown
Collaborator

최종 수정

파일 변경 내용
BattleDisconnectHandler.java 미사용 publisher 필드/생성자 제거, disconnect 시 즉시 publish 제거
GracePeriodConsumer.java PARTICIPANT_LEFTPARTICIPANT_STATUS_CHANGED(ABANDONED)
BattleRoomService.java joinRoom ABANDONED 재입장 시 항상 PARTICIPANT_STATUS_CHANGED(PLAYING) 발행
BattleDisconnectHandlerTest.java publisher 검증 제거, never().publish() 추가
GracePeriodConsumerTest.java 기대 메시지 변경
BattleRoomServiceJoinRoomTest.java ABANDONED 재입장 케이스 단일화

주요 변경 내용

  1. BattleDisconnectHandler — disconnect 시 즉시 publish 제거

    // 변경 전: afterCommit에서 PARTICIPANT_STATUS_CHANGED(ABANDONED) 즉시 발행 후 grace 시작
    // 변경 후: grace 시작만 함
    afterCommit() {
        reconnectStore.startGracePeriod(memberId);
    }
  2. GracePeriodConsumer — 메시지 타입 변경

    // 변경 전
    Map.of("type", "PARTICIPANT_LEFT", "userId", memberId)
    
    // 변경 후
    Map.of("type", "PARTICIPANT_STATUS_CHANGED", "userId", memberId, "status", "ABANDONED")
  3. BattleRoomService.joinRoom() — 재입장 시 항상 PLAYING 발행

    boolean wasAbandoned = participant.getStatus() == BattleParticipantStatus.ABANDONED;
    
    if (participant.getStatus() == BattleParticipantStatus.READY || wasAbandoned) {
        if (wasAbandoned) {
            reconnectStore.cancelGracePeriod(memberId);
        }
        publishPlaying = true; // grace 만료 여부와 무관하게 항상 발행
        participant.join();
        battleParticipantRepository.save(participant);
    }

변경 전/후 비교

1. disconnect 직후

변경 전 변경 후
DB PLAYING → ABANDONED PLAYING → ABANDONED
방 WebSocket PARTICIPANT_STATUS_CHANGED(ABANDONED) 즉시 발행 아무것도 안 보냄
다른 사람 화면 즉시 ABANDONED 표시 변화 없음

2. 15초 내 재입장

변경 전 변경 후
DB ABANDONED → PLAYING ABANDONED → PLAYING
방 WebSocket PARTICIPANT_STATUS_CHANGED(PLAYING) 발행 PARTICIPANT_STATUS_CHANGED(PLAYING) 발행
다른 사람 화면 ABANDONED 표시됐다가 PLAYING으로 복구 PLAYING 상태 그대로 (idempotent 덮어쓰기)

3. 15초 후에도 미복귀

변경 전 변경 후
grace 만료 시 이벤트 PARTICIPANT_LEFT PARTICIPANT_STATUS_CHANGED(ABANDONED)
다른 사람 화면 "나갔음" 표시 ABANDONED 상태로 표시

4. 15초 후 재입장 (grace 만료 뒤) — 동일

변경 전 변경 후
방 WebSocket PARTICIPANT_STATUS_CHANGED(PLAYING) 발행 PARTICIPANT_STATUS_CHANGED(PLAYING) 발행
다른 사람 화면 ABANDONED였다가 PLAYING으로 복구 ABANDONED였다가 PLAYING으로 복구

핵심 변화 한 줄 요약

disconnect 시 즉시 ABANDONED를 publish하지 않고 15초 grace period 후에만 공개하는 구조로 바뀌었고, 재입장 시에는 grace 만료 여부와 무관하게 항상 PLAYING을 발행하는 idempotent 설계를 채택했다.

@MADUPAL MADUPAL self-assigned this Apr 11, 2026
@MADUPAL MADUPAL linked an issue Apr 11, 2026 that may be closed by this pull request
2 tasks
@MADUPAL MADUPAL merged commit 9308a7e into dev Apr 13, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[fix] battleRoom 이탈 관련 수정

3 participants